home *** CD-ROM | disk | FTP | other *** search
- package sun.tools.tree;
-
- import java.io.PrintStream;
- import java.util.Hashtable;
- import sun.tools.asm.Assembler;
- import sun.tools.java.AmbiguousField;
- import sun.tools.java.ClassDefinition;
- import sun.tools.java.ClassNotFound;
- import sun.tools.java.CompilerError;
- import sun.tools.java.Constants;
- import sun.tools.java.Environment;
- import sun.tools.java.FieldDefinition;
- import sun.tools.java.Identifier;
- import sun.tools.java.Type;
-
- public class FieldExpression extends UnaryExpression {
- // $FF: renamed from: id sun.tools.java.Identifier
- Identifier field_0;
- FieldDefinition field;
- boolean parsed = false;
-
- public FieldExpression(int var1, Expression var2, Identifier var3) {
- super(46, var1, Type.tError, var2);
- this.field_0 = var3;
- }
-
- public FieldExpression(int var1, Context var2, FieldDefinition var3) {
- super(46, var1, var3.getType(), var3.isStatic() ? null : new ThisExpression(var1, var2));
- this.field_0 = var3.getName();
- this.field = var3;
- }
-
- Identifier toIdentifier() {
- StringBuffer var1 = new StringBuffer();
- FieldExpression var2 = this;
- var1.append('.');
- var1.append(this.field_0);
-
- while(var2.right.op == 46) {
- var2 = (FieldExpression)var2.right;
- var1.insert(0, var2.field_0);
- var1.insert(0, '.');
- }
-
- if (var2.right.op != 60) {
- return null;
- } else {
- var1.insert(0, ((IdentifierExpression)var2.right).id);
- return Identifier.lookup(var1.toString());
- }
- }
-
- Type toType(Environment var1, Context var2) {
- Identifier var3 = this.toIdentifier();
- if (var3 == null) {
- var1.error(super.where, "invalid.type.expr");
- return Type.tError;
- } else {
- return Type.tClass(var3);
- }
- }
-
- static Expression mungeFieldRight(Expression var0, Environment var1, Context var2, IdentifierExpression[] var3) throws ClassNotFound, AmbiguousField {
- switch (var0.op) {
- case 46:
- FieldExpression var8 = (FieldExpression)var0;
- Expression var9 = mungeFieldRight(var8.right, var1, var2, var3);
- if (var9 != null) {
- var8.right = var9;
- return var0;
- } else {
- Identifier var10 = var8.toIdentifier();
- if (var10 != null && var1.classExists(var10)) {
- Type var7 = var0.toType(var1, var2);
- return new TypeExpression(var0.where, var7);
- }
-
- return null;
- }
- case 60:
- Identifier var4 = ((IdentifierExpression)var0).id;
- if (var2.getField(var1, var4) != null) {
- return var0;
- } else {
- Type var5 = var0.toType(var1, var2);
- Identifier var6 = var5.getClassName();
- if (var1.classExists(var6)) {
- return new TypeExpression(var0.where, var5);
- }
-
- var3[0] = (IdentifierExpression)var0;
- return null;
- }
- default:
- return var0;
- }
- }
-
- public long checkValue(Environment var1, Context var2, long var3, Hashtable var5) {
- try {
- boolean var6 = false;
- IdentifierExpression[] var7 = new IdentifierExpression[1];
- Expression var8 = mungeFieldRight(super.right, var1, var2, var7);
- if (var8 == null) {
- var1.error(var7[0].where, "undef.var", var7[0].id);
- return var3;
- }
-
- super.right = var8;
- if (var8 instanceof TypeExpression) {
- var6 = true;
- } else {
- var3 = super.right.checkValue(var1, var2, var3, var5);
- }
-
- if (!super.right.type.isType(10)) {
- if (super.right.type.isType(9) && this.field_0.equals(Constants.idLength)) {
- super.type = Type.tInt;
- return var3;
- }
-
- if (!super.right.type.isType(13)) {
- var1.error(super.where, "invalid.field.reference", this.field_0, super.right.type);
- }
-
- return var3;
- }
-
- ClassDefinition var9 = var1.getClassDefinition(super.right.type);
- this.field = var9.getVariable(var1, this.field_0);
- if (this.field == null) {
- if ((this.field = var9.findAnyMethod(var1, this.field_0)) != null) {
- var1.error(super.where, "invalid.field", this.field_0, this.field.getClassDeclaration());
- } else {
- var1.error(super.where, "no.such.field", this.field_0, var9);
- }
-
- return var3;
- }
-
- ClassDefinition var10 = var2.field.getClassDefinition();
- super.type = this.field.getType();
- if (!var10.canAccess(var1, this.field)) {
- var1.error(super.where, "no.field.access", this.field_0, var9, var2.field.getClassDeclaration());
- return var3;
- }
-
- if (var6 && !this.field.isStatic()) {
- ClassDefinition var11 = this.field.getClassDefinition();
- if (!var11.implementedBy(var1, var2.field.getClassDeclaration()) || var2.field.isStatic()) {
- var1.error(super.where, "no.static.field.access", this.field_0, var9);
- return var3;
- }
-
- super.right = new ThisExpression(super.right.where);
- var3 = super.right.checkValue(var1, var2, var3, var5);
- var6 = false;
- }
-
- if (this.field.isProtected() && !(super.right instanceof SuperExpression) && !var10.protectedAccess(var1, this.field, super.right.type)) {
- var1.error(super.where, "invalid.protected.field.use", this.field.getName(), this.field.getClassDeclaration(), super.right.type);
- return var3;
- }
-
- if (!this.field.isStatic() && super.right.op == 82 && (var3 & 1L) == 0L) {
- var1.error(super.where, "access.inst.before.super", this.field_0);
- }
-
- var2.field.getClassDefinition().addDependency(this.field.getClassDeclaration());
- } catch (ClassNotFound var12) {
- var1.error(super.where, "class.not.found", var12.name, var2.field);
- } catch (AmbiguousField var13) {
- var1.error(super.where, "ambig.field", this.field_0, var13.field1.getClassDeclaration(), var13.field2.getClassDeclaration());
- }
-
- return var3;
- }
-
- public long checkLHS(Environment var1, Context var2, long var3, Hashtable var5) {
- this.checkValue(var1, var2, var3, var5);
- if (this.field == null) {
- if (super.right.type.isType(9) && this.field_0.equals(Constants.idLength)) {
- var1.error(super.where, "invalid.lhs.assignment");
- }
- } else if (this.field.isFinal()) {
- var1.error(super.where, "assign.to.final", this.field_0);
- }
-
- return var3;
- }
-
- public long checkAssignOp(Environment var1, Context var2, long var3, Hashtable var5, Expression var6) {
- this.checkValue(var1, var2, var3, var5);
- if (this.field == null) {
- if (super.right.type.isType(9) && this.field_0.equals(Constants.idLength)) {
- super.checkAssignOp(var1, var2, var3, var5, var6);
- }
- } else if (this.field.isFinal()) {
- var1.error(super.where, "assign.to.final", this.field_0);
- }
-
- return var3;
- }
-
- public Expression inline(Environment var1, Context var2) {
- return super.right != null ? super.right.inline(var1, var2) : null;
- }
-
- public Expression inlineValue(Environment var1, Context var2) {
- try {
- if (this.field == null) {
- return (Expression)(this.field_0.equals(Constants.idLength) ? (new LengthExpression(super.where, super.right)).inlineValue(var1, var2) : this);
- } else {
- if (super.right != null && super.right.op == 147) {
- super.right = null;
- }
-
- if (this.field.isFinal()) {
- Expression var3 = (Expression)this.field.getValue(var1);
- if (var3 != null && var3.isConstant()) {
- return (new CommaExpression(super.where, super.right, var3)).inlineValue(var1, var2);
- }
- }
-
- if (super.right != null) {
- if (this.field.isStatic()) {
- Expression var5 = super.right.inline(var1, var2);
- super.right = null;
- if (var5 != null) {
- return new CommaExpression(super.where, var5, this);
- }
- } else {
- super.right = super.right.inlineValue(var1, var2);
- }
- }
-
- return this;
- }
- } catch (ClassNotFound var4) {
- throw new CompilerError(var4);
- }
- }
-
- public Expression inlineLHS(Environment var1, Context var2) {
- if (super.right != null && super.right.op == 147) {
- super.right = null;
- }
-
- if (super.right != null) {
- if (this.field.isStatic()) {
- Expression var3 = super.right.inline(var1, var2);
- super.right = null;
- if (var3 != null) {
- return new CommaExpression(super.where, var3, this);
- }
- } else {
- super.right = super.right.inlineValue(var1, var2);
- }
- }
-
- return this;
- }
-
- public int costInline(int var1) {
- return 3 + (super.right != null ? super.right.costInline(var1) : 0);
- }
-
- int codeLValue(Environment var1, Context var2, Assembler var3) {
- if (this.field.isStatic()) {
- if (super.right != null) {
- super.right.code(var1, var2, var3);
- return 1;
- } else {
- return 0;
- }
- } else {
- super.right.codeValue(var1, var2, var3);
- return 1;
- }
- }
-
- void codeLoad(Environment var1, Context var2, Assembler var3) {
- if (this.field == null) {
- throw new CompilerError("should not be null");
- } else if (this.field.isStatic()) {
- var3.add(super.where, 178, this.field);
- } else {
- var3.add(super.where, 180, this.field);
- }
- }
-
- void codeStore(Environment var1, Context var2, Assembler var3) {
- if (this.field.isStatic()) {
- var3.add(super.where, 179, this.field);
- } else {
- var3.add(super.where, 181, this.field);
- }
- }
-
- public void codeValue(Environment var1, Context var2, Assembler var3) {
- this.codeLValue(var1, var2, var3);
- this.codeLoad(var1, var2, var3);
- }
-
- public void print(PrintStream var1) {
- var1.print("(");
- if (super.right != null) {
- super.right.print(var1);
- } else {
- var1.print("<empty>");
- }
-
- var1.print("." + this.field_0 + ")");
- }
- }
-